←
▼
▲
Dim MakeFileClass::Name as string
メイクファイルの名前。
MakeFileClass::DebugMode に MakeFileClass::c.OutDebugXML を設定するときに
表示されます。
←
▼
▲
Dim MakeFileClass::Variables as LazyDictionaryClass
ユーザー定義変数の集まり。
MakeFileClass を生成した時点で、LazyDictionaryClass のオブジェクトは生成されています。
Variables が指しているオブジェクトは、
でも参照できます。
MakeRule::Variables で自動的に設定される変数と同じ名前の変数をユーザーが定義すると
上書きされてしまうので注意してください。
←
▼
▲
Dim MakeFileClass::Delegate as variant
委譲先となるユーザー定義オブジェクト。
Sub main()
Dim mk : Set mk = new MakeFileClass
mk.AddRule new_Target_txt_Rule()
mk.Delegate = "ABC"
mk.Make
End Sub
Sub Target_txt_Command( a_MakeFile, a_MakeRule )
echo a_MakeFile.Delegate
End Sub
MakeFileClass クラスのオブジェクトを生成するときにユーザ定義オブジェクトを Delegate に格納しておくと、
MakeRule::Command で呼ばれる関数の中で、第1引数である MakeFileClass オブジェクトの
Delegate からユーザ定義オブジェクトを、参照することができるようになります。
Delegate
Delegate
←
▼
▲
Dim MakeFileClass::DebugMode as integer
Dim MakeFileClass::DebugMode_Param1 as variant
メイクファイルのデバッグモード
DebugMode = MakeFileClass::c.OutDebugXML のとき
メイクを実行する直前に、どのコマンドがあって、どのコマンドを実行するのかを
XML で表示します。 スクリプトは、pause によって一時停止します。
DebugMode = MakeFileClass::c.BreakBeforeCommand のとき
DebugMode_Param1 as string
ブレークする MakeRule::Target の一部
Empty = すべて Stop する
指定の MakeRule のコマンドを実行する直前で Stop します。
DebugMode = MakeFileClass::c.Watch のとき
それぞれの MakeRule のコマンドを実行する前と後で、指定の関数を呼び出します。
DebugMode_Param1 as Sub
呼び出す関数。GetRef を使ってください
Sub ( Delegate as variant, Rule as MakeRule )
呼び出す関数のパラメーターは、MakeRule::Command と同じです。
c は、MakeFileClass::c で参照できる MakeFileClassConst オブジェクトです。
←
▼
▲
サンプル
(src)
.Command によって作られるファイルのパス。
.Command を実行するのに必要となるファイルのパスの配列。
Target のタイムスタンプが、Sources より新しいときに実行する関数。
定数の集まり (Read Only)
委譲先となるユーザー定義オブジェクト。
MakeRule オブジェクトを生成したときのカレント・フォルダ。 (Read Only)
メイクルールの種類。
優先度。 大きいほど優先する。
最もタイムスタンプが新しい Sources のファイルパス。
ターゲットよりタイムスタンプが新しいファイルパスの配列。
ユーザー定義変数と、MakeFile の自動変数の集まり。 (Read Only)
新規作成するときは、少なくとも Target、Sources、Command を初期化してください。
←
▼
▲
.Command によって作られるファイルのパス。
または、Command が最後まで完了したら更新するファイルのパス。
相対パスを指定するとき、基準フォルダは .CurrentDirectory。
Dim MakeRule::Target as string
(src)
MakeRule::Target
MakeRule::Sources(0)
A.obj
A.c
動作
( Target : Sources ) が ( A.obj : A.c ), ( B.obj : B.c ) のルールがあるとき、
MakeRule::Target と MakeRule::Sources(0) にワイルドカードがあるかどうかによって、
動作がどのように違うかを示します。
A.c
*.obj
エラー(未対応)
*.c
*.obj
A.obj
*.c
エラー(未対応)
A.c が更新されたらコマンドを実行
A.c が更新されたら A.c に対するコマンドを実行、
B.c が更新されたら B.c に対するコマンドを実行
Function new_Target_txt_Rule()
Set o = new MakeRule
o.Sources = Array( "Source\*.txt" )
o.Target = "Target\*.txt"
Set o.Command = GetRef("Target_txt_Command")
Set new_Target_txt_Rule = o
End Function
Sub Target_txt_Command( Param, Rule )
copy_ren Rule.Sources(0), Rule.Target
End Sub
サンプル
Source フォルダーにある *.txt ファイルが更新されたら、Target フォルダーにコピーする
←
▼
▲
Dim MakeRule::Sources as Array of string
.Command を実行するのに必要となるファイルのパスの配列。
または、Command を起動するときに更新するファイルのパス。
相対パスをしていするとき、基準フォルダは .CurrentDirectory。
(src)
参考
←
▼
▲
Dim MakeRule::Command as Sub( Delegate as variant, Rule as MakeRule )
Target のタイムスタンプが、Sources より新しいときに実行する関数。
GetRef で代入してください。
Delegate 引数は、MakeFileClass::Delegate
(src)
←
▼
▲
Dim MakeRule::Variables as LazyDictionaryClass
ユーザー定義変数と、MakeFile の自動変数の集まり。
MakeFile の自動変数
また、
に相当する下記の変数が定義されます。
に指定した関数がコールバックされている間は、
$@
target (:の左)
a.o : a.c
$(CC) -c -o ${Target} ${Sources}
a.o : a.c
$(CC) -c -o a.o a.c
$<
source (:の右) の1つ目
$?
source (:の右) の全体
a.o : a.c b.h
@echo a.c b.h
a.o : a.c b.h
@echo ${Sources}
$*
target の拡張子を除いたもの
a.o : a.c
$(CC) -c -o ${Target} ${TargetNoExt}.c
a.o : a.c
$(CC) -c -o a.o a.c
a.o : a.c b.h
@echo a.c
a.o : a.c b.h
@echo ${Sources[0]}
${Target}
下記の凡例:
Variables にある変数名
MakeFile の自動変数名
${Sources}
${Sources[0]}
${TargetNoExt}
参照または変更することができます。
と同じオブジェクトを参照しており、そこに設定した変数を
と同じ値です。
を
に渡した出力です。
の1つ目の要素と同じ値です。
の拡張子を除いたものです。
相対パスのフォルダー部分も含みます。
相対パスのフォルダー部分も含みます。
相対パスのフォルダー部分も含みます。
相対パスのフォルダー部分も含みます。
ただし、\ は \\ に変換されません。
←
▼
▲
Dim MakeRule::CurrentDirectory as string
MakeRule オブジェクトを生成したときのカレント・フォルダ。
(src)
MakeRule::Target や MakeRule::Sources に格納されている相対パスの基準パス。
MakeRule::Command の関数が呼ばれる直前で、カレント・フォルダがこの値になります。
←
▼
▲
Dim MakeRule::Delegate as variant
委譲先となるユーザー定義オブジェクト。
(src)
MakeRule クラスのオブジェクトを生成するときにユーザー定義オブジェクトを Delegate に格納しておくと、
MakeRule::Command で呼ばれる関数の中で、第2引数である MakeRule オブジェクトの
Delegate からユーザー定義オブジェクトを、参照することができるようになります。
Function new_Target_txt_Rule()
Set new_Target_txt_Rule = new MakeRule : With new_Target_txt_Rule
.Sources = Array( "Source1.txt", "Source2.txt" )
.Target = "Target.txt"
.Delegate = "ABC"
Set .Command = GetRef("Target_txt_Command")
End With
End Function
Sub Target_txt_Command( a_MakeFile, a_MakeRule )
echo a_MakeRule.Delegate
End Sub
Delegate
Delegate
←
▼
▲
Dim MakeRule::Type_ as integer
メイクルールの種類。
(src)
Empty
c.Splitter
普通のメイクルール
ターゲットが存在しないときでも、コマンドを実行しないメイクルール
c は、MakeRule::c で参照できる MakeFileClassConst オブジェクトです。
→ オーダー調整用更新分離パス
参考
←
▼
▲
Dim MakeRule::Priority as integer
優先度。 大きいほど優先する。
(src)
同じ MakeRule::Target の値を持つ MakeRule が複数あるときは、その複数の中で、
MakeRule::Priority が最も大きい MakeRule::Command の関数だけが呼ばれます。
←
▼
▲
Property Get MakeRule::NewestSource() as string
最もタイムスタンプが新しい MakeRule::Sources 配列の要素。ファイルパス。
(src)
タイムスタンプを比較するタイミングは、この NewestSource プロパティを参照したときです。
←
▼
▲
Property Get MakeRule::AllNewSource() as Array of string
(src)
MakeRule::Sources の中で、ターゲットよりタイムスタンプが新しいファイルパスの配列。
タイムスタンプを比較するタイミングは、この AllNewSource プロパティを参照したときです。
←
▼
▲
(src)
Function MakeRule_compare( TargetPath, SourcePath ) as boolean
タイムスタンプを比較して、メイク・コマンドを実行する状況かどうかを返す。
【引数】
TargetPath
SourcePath
ターゲット・ファイルのパス。 メイクルールの : より左側
ソース・ファイルのパス。 メイクルールの : より右側
返り値
メイク・コマンドを実行する状況かどうか
関連
サンプル
If MakeRule_compare( "dst.txt", "src.txt" ) Then
copy_ren "src.txt", "dst.txt"
End If
参考
←
▼
▲
.Splitter (=1)
.OutDebugXML (=1)
.BreakBeforeCommand (=2)
.Watch (=4)
取得
get_MakeFileClassConst 関数、MakeFileClass::c、MakeRule::c
メンバー
メイクファイルに関する定数
←
▼
▲
MakeFileClass
.RuleGroups
dictionary< target_path, MakeRuleGroup >
.Rules
ArrayClass< MakeRuleSpec >
.UserFiles
ArrayClass< MakeRuleSpec >
(src)
(src)
(src)
.Rule
MakeRule
(src)
string
.Target
.Sources
array< string >
// 辞書のキー、Target と Sources の両方
.TargetPath
string
←
▼
▲
Set maker = OpenForMakeRuleOfRevisionFolder( "C:\Masters\MakeRule.xml" )
echo maker.GetMakeTreeString( "C:\Masters\Module\01" )
Function OpenForMakeRuleOfRevisionFolder( in_RuleFilePath as string )
as MakeRuleSetOfRevisionFolderClass
make コマンドのような実行を、リビジョンのフォルダーに対して行ったことの記録を開きます。
【引数】
in_RuleFilePath
返り値
メイク ルール ファイルのパス、または、Empty
サンプル
テスト
ソース
→ ToolsLib.vbs
→ T_MakeRuleR.vbs
<?xml version="1.0" encoding="UTF-8"?>
<MakeRuleOfRevisionFolder>
<Variable name="${Files}" value="." type="FullPathType"/>
<MakeRule>
<Output path="${Files}\Step1\*"/>
<Input_ path="${Files}\Step2\*"/>
<Command>Command 1</Command> コマンド プロンプトに渡すコマンド
<Revisions>01</Revisions> Output と Input_ の path の最後の *
</MakeRule>
<MakeRule>
<Output path="${Files}\Step2\*"/>
<Input_ path="${Files}\Step3A\*"/>
<Input_ path="${Files}\Step3B\*"/>
<Command>Command 2</Command>
<RevisionSet>01, 03A, 03B</RevisionSet>
</MakeRule>
</MakeRuleOfRevisionFolder>
メイク ルール ファイル
Step1
Step2
Step3A
Step3B
01
01
03A
03B
Step1\01 を出力するために、Step3A\03A と Step3B\03B を入力して、Step2\01 を出力
する Command 2 を実行してから、Step2\01 を入力して、Step1\01 を出力する
Command 1 を実行したことの記録は、以下のようになります。
${Files}\Step1\01
${Files}\Step2\01
${Files}\Step3A\03A
${Files}\Step3B\03B
スクリプト:
表示:
Command 1
Command 2
新しいリビジョンに対して make コマンドのような実行をするときは、記録(メイク ルールの
ファイル)にある <Revisions>(CSV形式)の要素、または、<RevisionSet> を増やします。
Command 2
Command 1
04B_Tmp
04A_Tmp
02_Tmp
02_Tmp
Step3B
Step3A
Step2
Step1
下記の新しいリビジョンを追加したとき、<Revisions> の要素と <RevisionsSet> を追加します。
ただし、ツリーが決定するまで、暫定的にそれぞれのリビジョン名の末尾に _Tmp を入れた
ほうがよいでしょう。
:
<Revisions>02_Tmp, 01</Revisions>
:
<RevisionSet>02_Tmp, 04A_Tmp, 04B_Tmp</RevisionSet>
<RevisionSet>01, 03A, 03B</RevisionSet>
:
メイク ルール ファイルの変更後
02_Tmp,
<RevisionSet>02_Tmp, 04A_Tmp, 04B_Tmp</RevisionSet>
関連
OpenForMakeRuleOfRevisionFolder
${Revision[n]}
Command タグには、以下の変数を記述できます。
対象となるリビジョンの名前。 例:"02"
n は、0 から始まる Output タグと Input タグの順番の番号です。
${Output[n]}
メイクしてできるフォルダーのフル パス。 フォルダー名は、Work
固定です。 n は、${Revision[n]} の n と同じです。
1つの n に対して ${Output[n]} か ${Input[n]} のどちらかだけ参照
できます。
${Input[n]}
入力するフォルダーのフル パス。 フォルダー名は、Work 固定です。
n は、${Revision[n]} の n と同じです。
1つの n に対して ${Output[n]} か ${Input[n]} のどちらかだけ参照
できます。
MakeRule/Output
複数可能
コマンドを実行したら出力されるフォルダーのパス。
MakeRule/Input
複数可能
コマンドを実行するときに入力するフォルダーのパス。
Input タグと Input_ タグに違いはありません。、
MakeRule/Command
実行する
。
MakeRule/Revisions
MakeRule/Input_
複数可能
Input タグや Output タグに指定した * と置き換えるリビジョン名の集合。 CSV形式。
同じ親を持つすべての Input タグや Output タグに共通のリビジョン名に置き換えます。
複数のリビジョン名は、CSV 形式で指定します。 1つのリビジョン名は、1つの
RevisionSet タグに対応します。
複数可能
複数可能
MakeRule/RevisionSet
複数可能
Input タグや Output タグに指定した * と置き換えるリビジョン名の集合。 CSV形式。
CSV の要素の順番は、同じ親を持つ Input タグまたは Output タグの順番に対応
します。
←
▼
▲
.Variables
.MakeRules
LazyDictionaryClass
ArrayClass of MakeRule_OfRevisionFolder_Class
の返り値。
←
▼
▲
Function MakeRuleSetOfRevisionFolderClass::GetMakeTreeString(
in_RootFolderPath as string ) as string
メイク ルールのツリーを文字列で返します。
【引数】
in_RootFolderPath
返り値
最終出力フォルダーのパス
メイク ルールのツリーの文字列
ソース
→ ToolsLib.vbs
←
▼
▲
Function MakeRuleSetOfRevisionFolderClass::GetMakeRelations(
in_RootFolderPath as string ) as ArrayClass of MakeRule_OfRevisionFolder_Class
メイク ルールのツリー返します。
【引数】
in_RootFolderPath
返り値
最終出力フォルダーのパス
メイク ルールのツリー
ソース
→ ToolsLib.vbs
←
▼
▲
Sub MakeRuleSetOfRevisionFolderClass::LoadAdditionally( in_RootFolderPath as string )
メイク ルールを追加します。
【引数】
ソース
→ ToolsLib.vbs
in_RuleFilePath
追加するメイク ルール ファイルのパス、または、Empty
←
▼
▲
に、/ChildProcess オプションを付け、XML ファイルによるデータ
メイン・プロセスから、任意のデータ(例:
)を渡し、子プロセスが終了したら
メイン・プロセスに更新された データを返す、といったようなことができます。 このような
データの受け渡しができるようにするのが、/ChildProcess オプションによる子プロセス
の機能です。 OS が定義している子プロセスとは異なります。
cscript sample.vbs /ChildProcess:090401,1
/ChildProcess の右の値は、テンポラリ・フォルダにできるフォルダ名の数値の部分です。
テンポラリ・ファイル名は、下記のとおりです。 %Temp% は、C:\Document 〜 に変わります。
%Temp%\Report\090401\ChildProcess_1\In.xml
%Temp%\Report\090401\ChildProcess_1\Out.xml
参考
vbslib の RunProg 関数で、vbs ファイルを起動すると、自動的に VBScript を起動するときの
メイン・プロセス vbslib (WSH)
子プロセス vbslib (WSH)
の送受信ができるようになっています。 Shell::Run などで起動すると、/ChildProcess オプション
が自動的に付かないので、明示的に指定しない限り送受信できません。
→ テスト情報 I/F
→ T_ChildProcess1.vbs
テスト
(src)
XMLファイル
XMLファイル
vbslib では、エラー処理やデバッグ用に Err2 オブジェクトの送受信を自動的に必ず行います。
自動的に /ChildProcess オプションを付けないようにするには、/ChildProcess:0 を明示的に
指定します。
r= RunProg( "cscript sample.vbs /ChildProcess:0", "" )
VBScript でエラーを発生させるテストをするときに、/ChildProcess オプションが付くと、
Err2::ErrID (エラーが発生した番号) などの値がメイン・プロセスから継承された値となり、
Err2::ErrID の値が正しいかどうかのチェックができなくなってしまいます。 それを回避するには、
エラーを発生させるテスト・スクリプトでは、/ChildProcess:0 オプションを付けてください。(下記)
/ChildProcess オプションが(自動的にでも)付くと、エラーレベル(プロセスの返り値)の値が 21
でないとエラーとみなし、メイン・プロセス側でもエラーを発生させます。
参考
cscript sample.vbs
→
関連
←
▼
▲
RunProg
ParentChildProcess.m_OutFile.WriteLine
AppData.loadXML
Shell::Exec
new_ChildProcess_ifChildProcess
(VBScript global code)
main
new_ObjectFromStream
ParentChildProcess.m_OutFile.WriteLine
:
子プロセスのメイン処理
:
ParentChildProcess.m_OutFile.WriteLine
アプリケーションからの出力
ライブラリからの出力
ライブラリへの入力
アプリケーションへの入力
アプリケーションからの出力
ResumePop or FinalizeInModulesCaller::Class_Terminate
CallFinalizeInModules
ParentChildProcess::Finish
ParentChildProcess.m_OutFile.WriteLine
ライブラリからの出力
ライブラリへの入力
アプリケーションへの入力
参考
If TypeName( ParentProcess ) <> "ParentChildProcess" Then new_ParentProcess
アプリケーションがやり取りするときのみ呼び出す
ParentChildProcess::OnCallInParent
ParentChildProcess::OnReturnInParent
ParentChildProcess::Class_Terminate
受け渡しに使った XML ファイルを削除する
子プロセス起動
子プロセス終了
Out.xml
(src)
(src)
(src)
(src)
InterProcessData::OnReturnInChild
InterProcessData.OnCallInParent
InterProcessData.OnReturnInParent
g_InterProcess.OnCallInParent
(src)
InterProcessData.ProcessCallID + 1
ProcessCallID を+1する
InterProcess.OnCallInSub
Set g_ChildProcess = m
InitializeModule (vbslib.vbs)
new_ObjectFromStream
InitializeModule (vbslib または 任意の.vbs)
ParentProcess.m_OutFile.WriteLine
g_InterProcessからの出力
g_InterProcessへの入力
AppData, ChildProcess
InterProcess.OnReturnInChild
ParentChildProcess.m_OutFile.WriteLine
(src)
g_InterProcessからの出力
InterProcess::OnReturnInParent
new_ObjectFromStream
InterProcess.loadXML
g_InterProcessへの入力
AppData.xml
ParentProcess
(src)
main
Set g_InterProcess = new InterProcess
InitializeModule (vbslib.vbs)
メイン・プロセス起動
g_InterProcess.InterProcessDataArray.Add
InitializeModule (vbslib.vbs または 任意の.vbs)
LibData
プロセスが変わるときにコールバック
するように登録する
LibData
If WScript.Arguments.Named.Item("ChildProcess") Then
プロセスが変わるときにコールバックするように登録する
LibData
g_InterProcess.m_Data.Add
AppData
(src)
Set m_InXML = LoadXML( "Out.xml" )
Set m_InXML = LoadXML( "In.xml" )
(src)
FinalizeModule [vbslib.vbs]
Err2.OnSuccessFinish
エラー関係の調整
cmdline = cmdline +" /ChildProcess:"+ step_path +","+ pr.m_FileID
m.m_TempPath = env( "%TEMP%\Report\" ) +
m.m_DateID +"\ChildProcess_"+ m.m_FileID
(.vbs)
'// サブ・プロセスで発生したエラーを、メイン・プロセスでも投げる
If g_Err2.Num <> 0 Then
g_Err2.Raise
Err2::OnReturnInChild
(src)
(src)
Err2::OnCallInParent
(.vbs)
If m_OutFile_LastLine = "</ToChildProcess>" Then
(src)
ParentChildProcess::Finish
If m_OutFile_LastLine = "</ToParentProcess>"